package com.example.web.mapper;

import com.example.web.entity.Customer;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

@Mapper
public interface CustomerMapper {
    
    /**
     * 根据ID查询客户
     */
    Customer findById(@Param("id") Long id);
    
    /**
     * 查询客户列表（支持分页和筛选）
     */
    List<Customer> findCustomers(@Param("creatorId") Long creatorId,
                               @Param("status") String status,
                               @Param("keyword") String keyword,
                               @Param("offset") Integer offset,
                               @Param("limit") Integer limit);
    
    /**
     * 统计客户总数（支持筛选）
     */
    Long countCustomers(@Param("creatorId") Long creatorId,
                       @Param("status") String status,
                       @Param("keyword") String keyword);
    
    /**
     * 插入新客户
     */
    int insert(Customer customer);
    
    /**
     * 更新客户信息
     */
    int update(Customer customer);
    
    /**
     * 逻辑删除客户
     */
    int deleteById(@Param("id") Long id);
    
    /**
     * 检查联系方式唯一性（电话或邮箱）
     */
    int checkContactExists(@Param("phone") String phone, 
                          @Param("email") String email, 
                          @Param("excludeId") Long excludeId);
    
    /**
     * 根据创建人ID查询客户列表
     */
    List<Customer> findByCreatorId(@Param("creatorId") Long creatorId);
    
    /**
     * 根据日期范围查询新增客户
     */
    List<Customer> findCustomersByDateRange(@Param("creatorId") Long creatorId, 
                                           @Param("startDate") LocalDateTime startDate, 
                                           @Param("endDate") LocalDateTime endDate);
    
    /**
     * 查询高价值客户（已联系客户或朋友推荐）
     */
    List<Customer> findHighValueCustomers(@Param("creatorId") Long creatorId,
                                         @Param("startDate") LocalDateTime startDate,
                                         @Param("endDate") LocalDateTime endDate,
                                         @Param("keyword") String keyword);
}